/*
 细节知识点：
   @1 函数式编程 && 命令式编程
      函数式编程:把具体的操作过程“封装”到一个函数中,我们无需关注内部是如何处理的(How),只需要关注处理的结果(What)即可;
        + 使用便捷,开发效率高
        + 减少页面冗余代码「低耦合高内聚」
      命令式编程:具体如何去处理,是由自己实现及掌控的,关注How的过程！
        + 操作灵活,可以自主把控处理的每一个步骤
        + 处理性能一般比函数式编程式要好「例如：forEach循环要慢于for循环」
      总结：处理的数据量“较多”的情况下，使用命令式编程来提高性能！操作逻辑较为复杂，需要自己灵活把控处理步骤的情况下，也使用命令式编程！其余情况，优先推荐函数式编程！

   @2 匿名函数具名化
     特点：原本应该是匿名函数「例如：自执行函数、函数表达式、回调函数等」，但是我们会为其设置一个名字
     + 更规范的操作方式
     + 有助于匿名函数的递归操作
 */

/* // @1 匿名函数具名化，设置的名字，并不会在自己所处的(宿主环境)“上下文”中声明/定义
(function func(x) {
  // @2 在函数执行产生的私有上下文中，这个名字会被声明/定义，存储的值是“当前函数本身”！
  // @3 而且直接手动修改这个值是无效的「除非基于其它方式重新声明」
  func = 100;
  console.log(func); //函数本身
})(10);
console.log(func); //Uncaught ReferenceError: func is not defined */

// 推荐：基于函数表达式的方式创建函数「避免变量提升、函数执行只能放在定义后面、逻辑更加严谨」
// const fn = function fn() { };

/* 
"use strict";
let i = 0;
(function next() {
  if (i >= 6) return;
  i++;
  console.log('OK');
  // 控制函数再次执行
  // console.log(arguments.callee); //获取函数本身「JS严格模式下无法使用」
  next();
})(); 
*/

//====================================
/* 
// 需求：循环六次
new Array(6).fill(null).forEach(() => {
  console.log('OK');
}); 
*/

/* 
let arr = new Array(9999999).fill(null);

// 命令式编程
console.time('AA');
for (let i = 0; i < arr.length; i += 2) {
  let item = arr[i];
  // console.log(item, i);
}
console.timeEnd('AA');

// 函数式编程
console.time('BB');
arr.forEach((item, index) => {
  if (index % 2 === 0) {
    // console.log(item, index);
  }
});
console.timeEnd('BB'); 
*/